
package com.dstz.form.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import com.dstz.base.api.response.impl.ResultMsg;
import com.dstz.base.core.util.AppUtil;
import com.dstz.form.constants.SqlConstants;
import com.dstz.sys.api.service.ISysDataSourceService;

import net.sf.jsqlparser.statement.Statement;

/**
 * jdbc执行sql
 * 
 * @author xianggang
 */
public class JdbcTemplateUtil {
	
	private static Logger logger = LoggerFactory.getLogger(JdbcTemplateUtil.class);
	
	/**
	 * 根据数据源 使用JdbcTemplate 执行SQL,并指定是否可以回滚。
	 * 
	 * @param dsKey
	 * @param sql
	 * @return
	 * @return Response
	 * @author xianggang
	 * @date 2018年4月25日 下午3:28:19
	 */
	public static ResultMsg<String> executeSql(String dsKey, String sql) {
		
		ResultMsg<Statement> selectSqlRsp = SqlUtil.isSelectSql(sql);
		if (!selectSqlRsp.getIsOk()) {
			logger.error("sql格式不正确,sql:{}", sql);
			return ResultMsg.ERROR(selectSqlRsp.getMsg());
		}
		
		JdbcTemplate jdbcTemplate = getJdbcTemplate(dsKey);
		
		try {
			sql = SqlUtil.getNoDataSql(sql);
			jdbcTemplate.execute(sql);
			return ResultMsg.SUCCESS();
		} catch (Exception e) {
			logger.error("执行SQL异常。e:{}", e);
			return ResultMsg.ERROR(e.getMessage());
		}
		
	}
	
	/**
	 * 获取名称JdbcTemplate。
	 * 
	 * 
	 * SQL语句使用下面模版的形式。
	 * 执行类似的语句。
	 * select * from test where name=:name;
	 * Map<String, Object> paramMap = new HashMap<String, Object>();
	 * paramMap.put("name", "name5");
	 * 
	 * 
	 * @param jdbcTemplate
	 * 
	 * @return
	 */
	public static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(JdbcTemplate jdbcTemplate) {
		
		return new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
	}
	
	/**
	 * 获取字段类型
	 * 
	 * @param dataType
	 * @return
	 * @return String
	 * @author xianggang
	 * @date 2018年4月25日 下午3:32:15
	 */
	public static String getDataType(String dataType) {
		
		String dbType = dataType.toLowerCase();
		
		String number = "tinyint,bigint,smallint,int,decimal,number,numeric,BIGINT UNSIGNED,bigint unsigned";
		String doubleCol = "double,float";
		String date = "date";
		String datetime = "timestamp,datetime";
		String text = "clob,text";
		String varchar = "varchar,varchar2,char";
		
		boolean isChar = isSpecType(dbType, varchar);
		if (isChar) {
			return SqlConstants.COLUMNTYPE_VARCHAR;
		}
		
		boolean isNumber = isSpecType(dbType, number);
		if (isNumber) {
			return SqlConstants.COLUMNTYPE_NUMBER;
		}
		boolean isDouble = isSpecType(dbType, doubleCol);
		if (isDouble) {
			return SqlConstants.COLUMNTYPE_DOUBLE;
		}
		
		boolean isDate = isSpecType(dbType, date);
		if (isDate) {
			return SqlConstants.COLUMNTYPE_DATE;
		}
		
		boolean isDateTime = isSpecType(dbType, datetime);
		if (isDateTime) {
			return SqlConstants.COLUMNTYPE_DATE_TIME;
		}
		
		boolean isText = isSpecType(dbType, text);
		if (isText) {
			return SqlConstants.COLUMNTYPE_TEXT;
		}
		
		return dbType;
	}
	
	/**
	 * 是否包含指定的数据类型。
	 * 
	 * @param dbType
	 * @param dataType
	 * 
	 * @return
	 */
	private static boolean isSpecType(String dbType, String dataType) {
		String[] aryType = dataType.split(",");
		for (String str : aryType) {
			if (dbType.equals(str)) { // || dbType.indexOf( str ) > -1
				return true;
			}
		}
		return false;
	}
	
	public static JdbcTemplate getJdbcTemplate(String dsKey) {
		JdbcTemplate jdbcTemplate = AppUtil.getBean(ISysDataSourceService.class).getJdbcTemplateByKey(dsKey);
		return jdbcTemplate;
	}
	
}
